# 单例模式装饰器

def singleton(cls):     # 接收一个类作为参数
    _instances = {}     # 存储每个类的单例对象

    # 接受任意数量的位置参数 *args 和关键字参数 **kwargs
    # func(1, 2, 3)、func('a', 'b')      *args
    # func(name='Tvux', age=18)          **kwargs
    def get_instance(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]

    # 返回了内部函数 get_instance 的引用。这意味着当我们将 @singleton 应用到一个类上时，
    # 实际上是将这个类作为参数传递给 singleton 函数，并将返回的 get_instance 函数应用到原始的类上。
    return get_instance